// satisfies -- TS4.9
// 类型检查
// 和类型断言as功能相似，但是比类型断言更加安全也更加智能，他在满足类型安全的前提下，自动帮我们做类型收窄和类型提示

interface IConfig {
  a: string | number;
}
// -------------11111-------------
// const legacyConfig: IConfig = {};
// console.log(legacyConfig.a); // 上面没有进行a的赋值，但是这里不会报错，非常不合理

// const config: IConfig = {} as IConfig;
// console.log(config.a); // 上面没有进行a的赋值，但是这里不会报错，非常不合理

// const current = {} satisfies IConfig; // error
// console.log(current.a); // 调用也会报错 // error 如果类型不安全，通过satisfies转化会提示错误。

//------------- 222222 -------------
// const curr1: IConfig = { a: 1 };
// curr1.a.toFixed(2);// error 类型“string | number”上不存在属性“toFixed”。

// const curr2 = { a: 1 } as IConfig;
// curr2.a.toFixed(2); // error 类型“string | number”上不存在属性“toFixed”。

const curr3 = { a: 1 } satisfies IConfig;
curr3.a.toFixed(2); // ok

// ------------- 333333 ------------- 项目实际应用！！！！

type MyElement = {
  src: string;
  alt: string;
  [key: string]: any;
};
const element: MyElement = {
  src: "123",
  alt: "123",
  width: 100,
}; // 不能满足element.的时候将width属性暴露出来
const element2 = { src: "123", alt: "123", width: 100 } as MyElement; // 在element2.的时候不会提示width属性
const element1 = { src: "123", alt: "123", width: 100 } satisfies MyElement; // 在element1.的时候提示项中有width属性 (赋值时自动推断了！！！)

export {};
